Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Помогите составить эффективный запрос к MySQL (mrMoRiC)
Author Message
mrMoRiC
Участник форума



Joined: 16 Jul 2007
Posts: 76
Карма: -2
   поощрить/наказать


PostPosted: Tue Dec 11, 2007 1:44 pm (написано за 8 минут 51 секунду)
   Post subject: Помогите составить эффективный запрос к MySQL
Reply with quote

Есть три таблицы:
Pages (поля:id, page_name, perent_id),
Templates (поля: id, template_name, template_body),
PageTemplates (поля: id, id_page, id_template)

Ситуация такая. Получаем в главном скрипте, какую страницу загружать (page_name). Смотрим какой у неё id, смотрим сопоставлен ли с ней шаблон (или есть ли id_page=id в Templates). Если да, то грузим его. Иначе, смотрим id её родителя (родительской страницы perent_id), если perent_id != 0, то ищем теперь для перента шаблон в таблице Templates, иначе это корневая страница. Если у перента нет шаблона, то смотрим у перента более высокого уровня итак пока не наёдём шаблон для страницы.
Собственно вопрос: сколько же запросов надо к БД, чтобы это реализовать? Думается, что одним никак нереально, даже очень сложным.
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Tue Dec 11, 2007 7:16 pm (спустя 5 часов 32 минуты; написано за 10 секунд)
   Post subject:
Reply with quote

Тема для SQL вообще.
страница-шаблон связываем по LEFT JOIN
если извесна максимальная вложенность, то можно аналогисно через LEFT JOIN прицепить всех родителей, ну или по крайней мере наиболее распространненную глубину так стоит обработать. если актуального не нашли, придется делать второй запрос.
потом проверяем поля на не NULL чтобы определить есть там что-то или нет.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Dec 11, 2007 10:09 pm (спустя 2 часа 53 минуты)
   Post subject:
Reply with quote


М

Перенесено из форума: Разное :: PHP.
Перенесено в форум: Общие вопросы :: SQL.
Back to top
View user's profile Send private message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Tue Dec 11, 2007 11:31 pm (спустя 1 час 21 минуту; написано за 4 минуты 40 секунд)
   Post subject:
Reply with quote

Существует расхожая структура для реализации дерева - TABLE(parent, child) - и в рамках такой структуры SQL-запрос ничего не может сделать. Приходится использовать хранимые процедуры или же обработку на сервере приложений или клиенте.
Но существуют подходы с другой структурой. Вот ссылка
www.sql.ru/articles/mssql/01091502TreesInSQL.shtml
Позволяет сделать одним запросом.
Вобщем, тема очень интересная. Но решение - в поиске хорошей структуры. Кстати, в "Моем круге" - что-то используется такое?
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 13, 2007 6:01 pm (спустя 1 день 18 часов 30 минут; написано за 5 минут 42 секунды)
   Post subject:
Reply with quote

Так немного изменил таблицы, добавил полей и сделал из трёх две:

pages
id page_name level parent_id template_id

templates
id template_name template_url

Теперь насчёт
Quote:
если извесна максимальная вложенность, то можно аналогисно через LEFT JOIN прицепить всех родителей, ну или по крайней мере наиболее распространненную глубину так стоит обработать. если актуального не нашли, придется делать второй запрос.
потом проверяем поля на не NULL чтобы определить есть там что-то или нет.
Глубина известна (level), что вы понмаете под прицепть ВСЕХ РОДИТЕЛЕЙ. Можно какой-нибудь пример. Родитель это строка, как я могу через LEFT JOIN прицепить СТРОКУ с ТАБЛИЦЕ.
Вот я пишу:
SELECT t1.* FROM t1 AS pages LEFT JOIN t2 as pages ON t1 where .... Тут совмещаются две таблицы, вобще LEFT JOIN совмещет, я Вас не понял.
Back to top
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Dec 14, 2007 2:05 am (спустя 8 часов 3 минуты; написано за 5 минут 37 секунд)
   Post subject:
Reply with quote

Code (SQL): скопировать код в буфер обмена
SELECT
cut_t.name, p1_t.name, p2_t.name, p3_t.name
FROM pages AS cur_p
LEFT JOIN templates AS cur_t ON cur_p.template_id = cur_t.id
LEFT JOIN pages AS p1 ON cur_p.parent_id = p1.id
LEFT JOIN templates AS p1_t ON p1.template_id = p1_t.id
LEFT JOIN pages AS p2 ON p1.parent_id = p2.id
LEFT JOIN templates AS p2_t ON p2.template_id = p2_t.id
LEFT JOIN pages AS p3 ON p2.parent_id = p3.id
LEFT JOIN templates AS p3_t ON p3.template_id = p3_t.id
WHERE page_name=...
что прицепиться, будет не NULL
Back to top
View user's profile Send private message
mrMoRiC
Участник форума



Joined: 16 Jul 2007
Posts: 76
Карма: -2
   поощрить/наказать


PostPosted: Fri Dec 14, 2007 12:34 pm (спустя 10 часов 29 минут; написано за 5 минут 30 секунд)
   Post subject:
Reply with quote

Вот уточнил запрос, предложенный Вами:
Code (SQL): скопировать код в буфер обмена
 
Но sql пишет ошибку "неоднозначность page_name в выражении where".

Я в sql запросах новичок. Очень плохо себе представляю как вообще работает этот запрос. Мы получается последовательно соединяем pages с templates, templates с pages ... Но я не могу себе этого представить. Объясните подробно КАК это работает? И почему именно 7 LEFT JOIN?
Back to top
View user's profile Send private message
mrMoRiC
Участник форума



Joined: 16 Jul 2007
Posts: 76
Карма: -2
   поощрить/наказать


PostPosted: Fri Dec 14, 2007 2:29 pm (спустя 1 час 54 минуты; написано за 2 минуты 51 секунду)
   Post subject:
Reply with quote

Ура!!! Я всё понял. Получается мы как-бы делаем горизонтальный список, и первое не-NULL значение слева это и будет шаблон, который нужно применить к странице.
А неоднозначность лечится!=) Заменяем page_name на cur_p.page_name

Всем плюс, Спасибо, это наверно самый полезный топ для меня за всё моё пребывание на этом форуме!
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Apr 10, 2008 6:51 pm (спустя 3 месяца 27 дней 4 часа 21 минуту; написано за 7 минут 5 секунд)
   Post subject:
Reply with quote

Помогите, пожалуйста, с составлением запроса.
Задача такая: в таблице tabel поля kod1,chas1,dn1,kod2,chas2,dn2, ...,kod8,chas8,dn8. В зависимости от значений кода kodX (вариантов 6), надо выбрать соответствующее значение chasX или dnX, в результате должно получиться 6 новых полей
Back to top
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu Apr 10, 2008 8:04 pm (спустя 1 час 12 минут; написано за 22 секунды)
   Post subject:
Reply with quote

Гость
мало информации
Гость wrote:
надо выбрать соответствующее значение
каким образом задаётся соответсвие?
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Fri Apr 11, 2008 5:42 pm (спустя 21 час 38 минут; написано за 4 минуты 2 секунды)
   Post subject:
Reply with quote

SELECT kod01,chas01,den01,kod02,chas02,den02,kod03,chas03,den03, kod04,chas04, kod05,chas05, kod06,chas06, kod07,chas07, kod08,chas08,
 ISNULL(case when kod01='23'or kod01='37'or kod01='38' then chas01
 ...
 when kod08='23'or kod08='37'or kod08='38'then chas08 end,0 ) as gos,
ISNULL(case when kod01='09'or kod01='10'or kod01='66' then chas01
 ...
 when kod08='09'or kod08='10'or kod08='66'then chas08 end,0 ) as otp,
ISNULL(case when kod01='24'or kod01='76' then chas01
 ...
 when kod08='24'or kod08='76'then chas08
  end,0 ) as progul,
ISNULL(case when kod01='16'or kod01='17'or kod01='18'or kod01='25'or kod01='74' then chas01
 ...
 when kod08='16'or kod08='17'or kod08='18' or kod08='25'or kod08='74' then chas08 end,0 ) as svch from tabel

Это примерный код, который работает, но очень громозкий, можно ли как циклами или макроподстановками укоротить?
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML